// main/java/com/sos/util/GeoUtils.java
package com.sos.util;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 地理距离计算工具（基于经纬度）
 */
public class GeoUtils {
    private static final double EARTH_RADIUS = 6378137; // 地球半径(米)

    private static double rad(double d) {
        return d * Math.PI / 180.0;
    }

    /**
     * 计算两点间距离（米）
     * @param lat1 纬度1
     * @param lng1 经度1
     * @param lat2 纬度2
     * @param lng2 经度2
     * @return 距离（米）
     */
    public static double calculateDistance(BigDecimal lat1, BigDecimal lng1,
                                           BigDecimal lat2, BigDecimal lng2) {
        double radLat1 = rad(lat1.doubleValue());
        double radLat2 = rad(lat2.doubleValue());
        double a = radLat1 - radLat2;
        double b = rad(lng1.doubleValue()) - rad(lng2.doubleValue());
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +
                Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
        s = s * EARTH_RADIUS;
        return new BigDecimal(s).setScale(2, RoundingMode.HALF_UP).doubleValue();
    }
}